[アップデート]Transfer for SFTP が PrivateLink に対応したので、アカウント間のファイル共有に使ってみる
先日、AWS Transfer for SFTP の PrivateLink 対応が発表されました。これまではパブリックエンドポイントとしての利用のみでしたが、PrivateLink 対応によって、VPC 内はもちろんのこと、DirectConnect/VPN 経由のプライベートネットワークでも SFTP エンドポイントを利用することが出来るようになりました。
以前、「AWS アカウント間でのファイル共有に Transfer for SFTP を使いたい」という相談をいただいたのですが、IPアドレスでの制限が出来ないために断念したことがありました。
今回のアップデートによって、Internal NLB の PrivateLink と組み合わせることで、AWS アカウント間でフルマネージドな SFTP エンドポイントが実現できそうだったので試してみました。構成図は下記のようになります。
VPC ピアリングでも良いのですが、必要最低限のネットワーク接続に限定したい場面を想定し、PrivateLink でのアカウント間接続を選択しました。
Transfer for SFTP 用の VPCエンドポイント作成
Transfer for SFTP に使用する VPC エンドポイントおよび、VPC エンドポイントのセキュリティグループを作成します。
セキュリティグループは、 Internal NLB を配置するサブネットからの SSH(22)
を許可しています。
それでは VPC ダッシュボード から Endpoints
- Create Endpoint
でエンドポイントを作成していきます。サービスカテゴリは AWS services
を指定し、サービス名の一覧から com.amazonaws.ap-northeast-1.transfer.server
を選択します。
次に VPC とサブネットを選択します。
DNS 設定、セキュリティグループを選択し、Create endpoint
をクリックします。
VPC エンドポイントが作成できましたら、Subnet
タブから VPC エンドポイントに割り当てられたプライベート IP アドレスを確認します。後ほど、Internal NLB のターゲット指定に使用します。
Transfer for SFTP 用の VPCエンドポイント作成は以上です。
Transfer for SFTP の作成
次に、Transfer for SFTP を作成していきます。Transfer for SFTP ダッシュボードから Create server
をクリックします。今回のアップデートによって、Endpoint configuration で public
か VPC
を選択できるようになっていました。VPC
を選択すると、 VPC endpoint
の項目が表示されますので、先ほど作成した VPC エンドポイントを指定します。
Identity provider、Loging role、Tags はデフォルトのまま、Create server
をクリックします。
サーバーが作成されましたら、一覧から対象の Server ID
をクリックし、ユーザを作成します。ユーザ作成については割愛しますので、以下のエントリーを参考にしてください。
Internal NLB 作成
次に、Internal NLB を作成しますが、詳細な手順は割愛します。以下のような設定で作成しました。
- ロードバランサー
- Internal NLB
- リスナーポート: 22
- リスナープロトコル: TCP
- ターゲットグループ
- ポート: 22
- ターゲットタイプ: ip
- ターゲット
- 先ほど作成した Transfer for SFTP 用の VPC エンドポイントの IP を指定
VPC エンドポイントサービス作成
次に、アカウントA から PrivateLink を作成するために、VPC エンドポイントサービスを作成します。VPC ダッシュボード から Endpoint Services
- Create Endpoint Services
を開きます。先ほど作成した、 Internal NLB を指定。VPC エンドポイントサービスへの接続は承認を必要としたいので、Require acceptance for endpoint
を有効にしています。
VPC エンドポイントサービスが作成できたら、Whitelisted principals
タブを開き、Add principals to whitelist
から、許可する AWS アカウントもしくは IAM ユーザ、IAM ロールを登録します。今回はアカウントで許可するので、arn:aws:iam::aws-account-id:root
を追加しました。
アカウントAで PrivateLink 作成
それでは、アカウントAから先ほど作成したアカウントBの VPC エンドポイントサービスに PrivateLink を作成します。VPC ダッシュボード から Endpoint
- Create Endpoint
を開きます。Find service by name
を選択し、アカウントBの VPC エンドポイントサービスを指定します。
あとは VPC、サブネット、およびセキュリティグループを指定し、Create endpoint
を作成します。セキュリティグループは、SSH(22) を許可しています。
アカウントBで接続の承認
先の手順で、アカウントAから VPC エンドポイントサービスへの接続申請を行いましたので、アカウントBで接続承認を行います。VPC エンドポイントサービスの Endpoint Connections
タブを開き、申請されている Endopoit ID
を選択、Actions
から Accept endpoint connection requies
をクリックします。
Status が Available
になりましたら準備完了です!
アカウントAから接続テスト
アカウントA内の SFTP クライアントから、アカウントAの VPC エンドポイントを指定してアクセスしてみます。
$ dig vpce-xxxxxxxxxx-xxxxxx.vpce-svc-xxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com +short 172.31.3.232 ←アカウントAのプライベートIP 172.31.0.189 ←アカウントAのプライベートIP
sftpupload.txt
ファイルをアップロードしてみます。
アカウントBの SFTP ターゲットの S3 バケットを確認してます。
Internal NLB と PrivateLink を使って、AWS アカウント間のファイル共有に Transfer for SFTP が使えることが確認できました!
余談:PrivateLink と NLB で特定パブリック IP 許可ができるか?
2019.6.26 追記 NACL を使うことでパブリックアクセスを特定 IP に限定できる方法がありましたので、訂正記事を投稿しました。
今回は AWS アカウント間のプライベート環境でしたが、Internet facing な NLB で 特定 IP のみを許可することが来るでしょうか?
結論としては、フルマネージドサービスのみでは、現状は出来ません。理由としては、以下の2点です。
- NLB はセキュリティグループを設定できない
- ターゲットタイプ ip の場合、Source IP は NLB になる
このため、VPC Endpoint 側でパブリック SFTP クライアントの IP アドレスで制御することは出来ないと思われます。
PrivateLink の前段に、EC2 インスタンスのプロキシなどを配置すれば可能です。ただし、フルマネージドな SFTP サーバを使うために、ユーザマネージドなサーバを追加することになるので、何を目的とするのかは要検討ください。
さいごに
アカウント間でのプライベートなファイル共有としては、単純に S3 バケットと VPC エンドポイントで実現することは可能ですが、パッケージ製品であったりプログラム改修の手間から、既存で使える SFTP でやりたい、という場合には今回のような構成が使えるかと思います!
つい先日、「出来ないですね、、、」と断念したことが、アップデートによって実現できるようになる。これぞ AWS のスピード感やで!!というのを改めて感じました。
以上!大阪オフィスの丸毛(@marumo1981)でした!